検証: BEGIN TRANSACTIONとROLLBACKでトランザクションを戻す
トランザクションなし、オプションは現在の状態(16384より小さいからXACT_ABORTはOFF) code:cmd.sql
SELECT @@TRANCOUNT AS TRANSACTION_COUNT, XACT_STATE() AS XACT_STATE, @@OPTIONS AS OPTIONS;
table:result.csv
TRANSACTION_COUNT XACT_STATE OPTIONS
0 1 5432
トランザクション開始
トランザクションが始まっている
TRANSACTION_COUNT=1になっていることを確認
code:cmd.sql
BEGIN TRANSACTION;
SELECT @@TRANCOUNT AS TRANSACTION_COUNT, XACT_STATE() AS XACT_STATE, @@OPTIONS AS OPTIONS;
table:result.csv
TRANSACTION_COUNT XACT_STATE OPTIONS
1 1 5432
テーブルの初期状態を確認
何か起こったらこの状態に戻ってきたい
このテーブルはname, address, tellで一意となる
code:cmd.sql
SELECT name, address, tell FROM SAMPLE_TABLE;
table:result.csv
name address tell
データを操作する
code:cmd.sql
INSERT INTO SAMPLE_TABLE VALUES('Go','Japan','090-9999-9999');
INSERT INTO SAMPLE_TABLE VALUES('Go','Japan','080-8888-8888');
INSERT INTO SAMPLE_TABLE VALUES('Go','Japan','070-7777-7777');
INSERT INTO SAMPLE_TABLE VALUES('Go','Japan','070-7777-7777');--これが重複する
code:error.log
制約 'PK_SAMPLE_TABLE' の PRIMARY KEY 違反。
オブジェクト 'dbo.SAMPLE_TABLE' には重複するキーを挿入できません。
重複するキーの値は ('Go','Japan','070-7777-7777') です。
テーブルを確認すると成功したところまでは入っちゃってる。やばい
code:cmd.sql
SELECT name, address, tell FROM SAMPLE_TABLE;
table:result.csv
name address tell
Go Japan 090-9999-9999
Go Japan 080-8888-8888
Go Japan 070-7777-7777
しかし焦らない。トランザクションの状態を確認
途中で止まっているだけで、まだトランザクションの状態は生きてる
code:cmd.sql
SELECT @@TRANCOUNT AS TRANSACTION_COUNT, XACT_STATE() AS XACT_STATE, @@OPTIONS AS OPTIONS;
table:result.csv
TRANSACTION_COUNT XACT_STATE OPTIONS
1 1 5432
落ち着いてロールバックしてもう一度テーブルを確認
code:cmd.sql
ROLLBACK;
SELECT name, address, tell FROM SAMPLE_TABLE;
table:result.csv
name address tell
初期状態に戻れたよかった